iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
6
AI & Data

用Node.js製作後台零負擔的DiscordBot系列 第 5

Day5 - 函式庫文檔與基本範例講解

  • 分享至 

  • xImage
  •  

以下文章已於 2021/09/16 轉移至 微笑之家
對於discord.js更新,或是有其他問題,都歡迎到以下網址查看喔
本站
本主題
本文章


昨天我們成功叫醒了自己的兒子/女兒

在繼續教育小孩(增加功能)前,今天想說說昨天安裝的discord.js這個工具

該怎麼使用,以及應用後的例子

discord.js是node.js中的一個library,也就是其他人寫好的程式集
我們可以安裝他人發佈的程式並且引用,進而降低開發的難度與作業性

https://discord.js.org/#/

這是discord.js的文檔庫,裡面有此庫作者撰寫的使用說明,涵蓋了從以前到現在的發行版本,以及各種小細節

進來後,我們點擊最下面的Get Started

5-1

左側是discord.js的可用資源與方法,預設會在welcome頁面,這裡會介紹discord.js的功能與基本知識,我們先往下拉到 Example usage

5-2

這是discord.js的基本範例,拿來跟昨天的bot.js比對一下,是不是完全一樣呢?
只是範例中的 client.login(‘token’); 被我拉上去了;

這是因為在筆者的腦中,給機器人輸入key值是最優先的事情,再來依次進入ready(登入完成)->message(訊息接收)…不然各區塊的上下順序在這邊其實是沒有差別的。

5-3

下面說回來目前bot.js每一行的功效

const Discord = require('discord.js');

這行的意思是引用discord.js這個工具,然後賦予到Discord這個常數(const)上
之後如果要引用discord.js的程式碼,都可以直接調用Discord來實現!

const client = new Discord.Client();

新宣告一個 Discord(discord.js)下的Client方法,然後將Client方法的結果賦予到client這個常數上
之後如果要引用discord.js底下的Client,可以直接呼叫client。

這邊我們額外從Discord中拉出Client()是因為這個client是要用來當bot本體的,也就是我們的遙控器(x

const auth = require('./auth.json');

引用同目錄(./)下的auth.json,賦予給auth這個常數
之後想調用auth.json底下的資源,可以直接呼叫auth。

client.login(auth.key);

執行client的登入行為,登入的key我們放入bot的key

client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
});

執行client的監聽(on)行為,要監聽的事件是ready(準備完成)
只要client收到ready事件,就執行右邊的箭頭函式( () => {} )
箭頭函式的內容為

console.log(`Logged in as ${client.user.tag}!`);

在控制台打印(console.log) 出字串 Logged in as ${client.user.tag}!
Logged in as就是單純的字串
其中client.user.tag,我們可以從小數點來了解到,user是client底下的一個可用變數,tag則是user底下的一個可用變數
最後輸出的結果就是機器人的名字與id
如果要仔細了解client的內容物,可以將console.log裡面的東西改成client看看

client.on('message', msg => {
    if (msg.content === 'ping') {
        msg.reply('pong');
    }
});

監聽client的message(收到訊息)事件,觸發後執行箭頭函式 msg =>{}

這邊的msg是每當client收到message時,discord.js會給予我們的變數,我們將變數稱作msg
因為discord.js會回傳的變數是固定的,如果我們這邊像上面一樣寫成() => {}的話,雖然也可以執行但就不會將discord.js回傳的值再做處理。
反過來說,如果我們宣告了msg1跟msg2兩個變數來接回傳值,因為discord.js的message事件並沒有給我們這麼多參數,所以msg2是接收不到東西的

那麼要怎麼知道message事件下到底回傳了哪些參數呢?
這就要用到剛剛說的discord.js使用說明書了

https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-message

5-4

我們監聽message事件的說明在左側元素列表的client分類中的Events中可以找到,可以看到他回傳了 Message Type的變數,而這就是我們接收的內容。

繼續說箭頭函數內要做的事情

if (msg.content === 'ping') {
        msg.reply('pong');
    }

當msg變數底下的content元素,等於ping字串時,執行方法

msg.reply('pong');

使用msg底下的replay方法,並傳入pong字串。

以上的文言文翻譯過來就是
機器人(client)接收到訊息(message)的時候,去判斷訊息的內容(content)是不是ping
如果是,回傳pong(msg.reply)

5-5

先說到這,今天根據程式一行行做解釋,雖然很基本但對第一次觸碰這部分的人來說應該還是有點艱澀

請自行斟酌閱讀即可,明天我們說說如何讓機器人變得更聰明。


上一篇
Day4 - 機器人的家
下一篇
Day6 - 防呆觀念
系列文
用Node.js製作後台零負擔的DiscordBot31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
wifon
iT邦新手 5 級 ‧ 2020-12-07 21:45:01

你好,我今天剛學著做discord機器人
想問一下那些行動是只要自己用英文套用行為到模組裡面bot就會動了是嗎?
如果我想做一個聰明的機器人,能夠在一個月內完成嗎?

微笑 iT邦研究生 5 級 ‧ 2020-12-08 09:30:47 檢舉

我們要將自己想做的事情先整理成一個個步驟
在程式中找到對應的語法,之後寫進去bot就會動了

可以吧,bot並不困難,不過如果希望刻出自己的功能,主要還是要看您本身程式語言的基礎喔

0
wifon
iT邦新手 5 級 ‧ 2020-12-07 21:45:52

對你的文章有興趣,希望能繼續出

微笑 iT邦研究生 5 級 ‧ 2020-12-08 09:28:01 檢舉

感謝您!您也要加油喔/images/emoticon/emoticon41.gif

0
qqeet1122
iT邦新手 5 級 ‧ 2021-03-23 02:08:06

請問關於
if (msg.content === 'ping') {
msg.reply('pong');
}
這段的content判斷有沒有辦法讓兩個或以上的關鍵字導向同一個動作麼呢?

微笑 iT邦研究生 5 級 ‧ 2021-03-24 10:27:26 檢舉
if (msg.content === 'ping' || msg.content === 'pingping') {
msg.reply('pong');
}

if (msg.content === 'ping') {
msg.reply('pong');
}
if (msg.content === 'pingping') {
msg.reply('pong');
}

可以喔,這邊的邏輯只是示範而已,如果有繼續做後面的教學的話,到Day7這段程式碼會再改掉

qqeet1122 iT邦新手 5 級 ‧ 2021-03-28 22:08:47 檢舉

阿阿阿阿阿 非常感謝你QQ 這個問題困擾我好幾天了
一直在想要怎麼弄成一句
真的非常感謝!!!!!!!

微笑 iT邦研究生 5 級 ‧ 2021-03-29 15:56:45 檢舉

加油喔/images/emoticon/emoticon41.gif

0
lan02200059
iT邦新手 5 級 ‧ 2021-08-05 03:04:10

您好,請問要如何讓機器人的回覆換行?
例如我說ping
機器人回
pong
pong
我試過直接用/n換行,結果毫不易外大失敗XDDD(流淚

微笑 iT邦研究生 5 級 ‧ 2021-08-05 09:23:31 檢舉

是用\n

天啊我傻了QQQQQQQ
沒放在一起看完全沒發現我打錯
卡了一天了,非常感謝!!!!!!!!

0
TimOuO
iT邦新手 5 級 ‧ 2021-09-20 19:51:06

您好,請問機器人可以正常上線,但打出ping時他不會回我是發生甚麼樣的問題呢?

client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
});

client.on('message', msg => {

    if (msg.content === 'ping') { 
        msg.reply('pong!');
    }
});

client.login(token);
微笑 iT邦研究生 5 級 ‧ 2021-09-22 09:51:18 檢舉

最近discord.js的版本升級為13版
此寫法是基於discord.js 12.3.1,請確定是使用12版的函式庫喔

TimOuO iT邦新手 5 級 ‧ 2021-09-22 18:25:51 檢舉

了解 那我降回discord.js 12.3.1

Zeyrox iT邦新手 5 級 ‧ 2023-03-19 07:34:46 檢舉

你好,我的package.json下最後的discord.js已經是^12.3.1了,可是我打出ping時也沒反應該怎辦?

我要留言

立即登入留言